package com.biao.juc;

import java.util.concurrent.atomic.AtomicInteger;

public class Demo03_cas {
    /*
        锁的基础知识：
        公平锁：比较公平，按线程请求锁的顺序进行获取锁，可基于链表实现的队列，先进先出。
        非公平锁：根据线程能力进行争抢获取锁，非公平锁效率较高。 synchronized 是非公平锁
        new ReentrantLock(true)   公平锁
        new ReentrantLock(false)   非公平锁
     */

    public static void main(String[] args) {
        /*
            比如要把一个int类型变量从0修改为1, 修改之前先预存一下原来的值也就是0,
            修改的时候判断这个值是不是0, 如果不是0,是1或者2或者...,说明值发生修改,
            如果是0,说明这个值没有被修改, 和预想的一样, 然后再修改为1
            所以这样有ABA问题, 万一别的线程修改过以后, 又改为了0, 那怎么知道有没有发生ABA呢?
            解决办法可以通过添加一个版本号, 不光期望值一样, 版本号也要判断是否一致

            cas优点:     不会阻塞,因为是无锁操作, 使用时一直通过循环控制重试
            cas缺点:     如果是通过循环控制一直重试, CPU飙高会有影响

         */
        // cas: compareAndSwap      比较并且替换, 无锁操作的概念

        // atomic 包下的很多原子类, 都是基于cas操作
        AtomicInteger atomicInteger = new AtomicInteger(0);
//        atomicInteger.getAndIncrement();    // 加1, 提供的方法

        boolean b1 = atomicInteger.compareAndSet(0, 1);
        boolean b2 = atomicInteger.compareAndSet(0, 2);
        System.out.println(b1);     // true
        System.out.println(b2);     // false
        System.out.println(atomicInteger.get());    // 1
    }

}
